import {
	isFunction,
	noop,
	checkReg
} from "@/utils/utils"

const defaultConfig = {
	onValidate: noop
}

const REG_RULES = {
	//邮箱
	email: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]+)+$/,
	//数字
	digit: /^(\d+)$/,
	//验证金额
	money: /^\d+(\.\d+)?$/,
	//正整数,不能0开头或者负数
	numeric: /^[1-9]\d*$/,
	//手机号
	phone: /^1[3,4,5,6,7,8,9]\d{9}$/,
	//字母
	alpha: /^[a-zA-Z\s]+$/,
	//中文
	chinese: /^[\u2E80-\u9FFF]+$/,
	//日期
	date: /^((?:18|19|20|21)\d\d)-(0[1-9]|[1-9]|1[012])-(0[1-9]|[1-9]|[12][0-9]|3[01])$/,
	// 汉字、字母和、数字和下划线_组成
	legal_text: /^[a-zA-Z0-9\_\u4e00-\u9fa5]+$/i
}
class Form {
	constructor(config, options) {
		this.config = config || {};
		this.options = { ...defaultConfig,
			...options
		};
	}
	/**
	 * 根据配置验证数据， 返回是否所有通过
	 * 
	 * @param {Object} data
	 * 
	 * @return {Object} result
	 *   result.allPass 表示是否全部通过
	 *   result.result 保存每个name验证的结果
	 *   result.result['xxx'] : { validate , msg }
	 */
	validate(data) {
		let validateConfig = this.config;
		let names = Object.keys(validateConfig);
		let {
			allPass,
			result
		} = this.validateByNames(names, data);
		return {
			allPass,
			result
		};
	}

	/**
	 * 验证特定 name
	 * 结果： { validate, msg }
	 */
	validateByName(name, value) {
		let validateConfig = this.config;
		let configList = validateConfig[name];
		return Form.validate(configList, value);
	}

	/**
	 * 验证一系列的name
	 * 返回一个对象 result
	 * result.allPass 表示是否全部通过
	 * result.result 保存每个name验证的结果
	 * result.result['xxx'] : { validate , msg }
	 */
	validateByNames(names, data) {
		let allPass = true;
		let validateResult = {};
		for (let name of names) {
			let value = data[name];
			let result = this.validateByName(name, value);
			if (!result.validate) {
				validateResult[name] = result;
			}
			if (!result.validate) {
				allPass = false;
			}
			this.options.onValidate(name, validateResult);
		}
		return {
			allPass,
			result: validateResult
		};
	}


	/**
	 * 是否必填
	 */
	static required(value = '') {
		return value.length > 0;
	}

	// 是否邮箱
	static email(value = '') {
		return checkReg(REG_RULES.email, value)
	}

	// 是否数字
	static digit(value = '') {
		return checkReg(REG_RULES.digit, value);
	}

	/**
	 * 验证金额
	 */
	static money(value = '') {
		return checkReg(REG_RULES.money, value)
	}


	// 是否是手机号码
	static phone(value = '') {
		return checkReg(REG_RULES.phone, value);
	}

	// 是否是拼音
	static alpha(value = '') {
		return checkReg(REG_RULES.alpha, value);
	}
	//是否是正整数,不能为0也不能是负数
	static numeric(value = '') {
		return checkReg(REG_RULES.numeric, value)
	}

	// 是否是中文
	static chinese(value = '') {
		return checkReg(REG_RULES.chinese, value);
	}

	// 是否是日期格式
	static date(value = '') {
		return checkReg(REG_RULES.date, value);
	}

	// 是否是 汉字、字母和、数字和下划线_组成
	static legalText(value = '') {
		return checkReg(REG_RULES.legal_text, value);
	}

	/**
	 * 根据配置验证对应的值
	 */
	static validate(configList = [], value = '') {
		value = '' + value; //转化为字符串
		for (let i = 0; i < configList.length; i++) {
			let config = configList[i];
			let {
				validate,
				msg
			} = config;
			if (isFunction(validate)) {
				if (!validate(value)) {
					return {
						validate: false,
						msg
					};
				}
			}
		}
		return {
			validate: true
		};
	}

	static getFirstError(errorResult = {}) {
		let names = Object.keys(errorResult);
		if (names.length > 0) {
			return errorResult[names[0]];
		}
		return '';
	}
}

export default Form;
